package com.hello.system.service.impl;

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;
import com.hello.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hello.system.mapper.RentalDevicesMapper;
import com.hello.system.domain.RentalDevices;
import com.hello.system.domain.RentalDeviceInventory;
import com.hello.system.domain.vo.RentalDeviceWithInventoryVo;
import com.hello.system.service.IRentalDevicesService;
import com.hello.system.service.IRentalDeviceInventoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 设备Service业务层处理
 * 
 * @author hello
 * @date 2025-07-20
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RentalDevicesServiceImpl extends ServiceImpl<RentalDevicesMapper, RentalDevices> implements IRentalDevicesService 
{
    private final RentalDevicesMapper rentalDevicesMapper;
    private final IRentalDeviceInventoryService rentalDeviceInventoryService;

    /**
     * 查询设备
     * 
     * @param deviceId 设备主键
     * @return 设备
     */
    @Override
    public RentalDevices selectRentalDevicesByDeviceId(Long deviceId)
    {
        return rentalDevicesMapper.selectRentalDevicesByDeviceId(deviceId);
    }

    /**
     * 查询设备列表
     * 
     * @param rentalDevices 设备
     * @return 设备
     */
    @Override
    public List<RentalDevices> selectRentalDevicesList(RentalDevices rentalDevices)
    {
        return rentalDevicesMapper.selectRentalDevicesList(rentalDevices);
    }

    /**
     * 新增设备
     * 
     * @param rentalDevices 设备
     * @return 结果
     */
    @Override
    public int insertRentalDevices(RentalDevices rentalDevices)
    {
        rentalDevices.setCreateTime(DateUtils.getNowDate());
        return rentalDevicesMapper.insertRentalDevices(rentalDevices);
    }

    /**
     * 修改设备
     * 
     * @param rentalDevices 设备
     * @return 结果
     */
    @Override
    public int updateRentalDevices(RentalDevices rentalDevices)
    {
        rentalDevices.setUpdateTime(DateUtils.getNowDate());
        return rentalDevicesMapper.updateRentalDevices(rentalDevices);
    }


    /**
     * 批量删除设备
     * 
     * @param deviceIds 需要删除的设备主键
     * @return 结果
     */
    @Override
    public int deleteRentalDevicesByDeviceIds(Long[] deviceIds)
    {
        return rentalDevicesMapper.deleteRentalDevicesByDeviceIds(deviceIds);
    }

    /**
     * 删除设备信息
     * 
     * @param deviceId 设备主键
     * @return 结果
     */
    @Override
    public int deleteRentalDevicesByDeviceId(Long deviceId)
    {
        return rentalDevicesMapper.deleteRentalDevicesByDeviceId(deviceId);
    }

    /**
     * 查询设备列表（带库存信息）
     * 
     * @param rentalDevices 设备查询条件
     * @return 设备+库存信息集合
     */
    @Override
    public List<RentalDeviceWithInventoryVo> selectRentalDevicesWithInventoryList(RentalDevices rentalDevices)
    {
        log.info("======== 查询设备列表（带库存信息）请求 ========");
        log.info("请求参数: {}", rentalDevices);
        
        // 1. 查询设备列表
        List<RentalDevices> devicesList = rentalDevicesMapper.selectRentalDevicesList(rentalDevices);
        log.info("查询到设备数量: {}", devicesList.size());
        
        if (devicesList.isEmpty()) {
            log.info("======== 查询设备列表（带库存信息）完成：无数据 ========");
            return new ArrayList<>();
        }
        
        // 2. 获取所有设备的ID列表
        List<Long> deviceIds = devicesList.stream()
                .map(RentalDevices::getDeviceId)
                .collect(Collectors.toList());
        
        // 3. 查询库存信息
        List<RentalDeviceInventory> inventoryList = rentalDeviceInventoryService.selectRentalDeviceInventoryList(new RentalDeviceInventory());
        log.info("查询到库存记录数量: {}", inventoryList.size());
        
        // 4. 创建库存映射表（deviceId -> inventory）
        Map<Long, RentalDeviceInventory> inventoryMap = inventoryList.stream()
                .collect(Collectors.toMap(
                    RentalDeviceInventory::getDeviceId,
                    inventory -> inventory,
                    (existing, replacement) -> existing // 如果有重复key，保留第一个
                ));
        
        // 5. 组装设备+库存信息
        List<RentalDeviceWithInventoryVo> resultList = devicesList.stream()
                .map(device -> {
                    RentalDeviceWithInventoryVo deviceWithInventory = new RentalDeviceWithInventoryVo(device);
                    RentalDeviceInventory inventory = inventoryMap.get(device.getDeviceId());
                    deviceWithInventory.setInventoryInfo(inventory);
                    return deviceWithInventory;
                })
                .collect(Collectors.toList());
        
        log.info("组装完成，返回设备+库存信息数量: {}", resultList.size());
        log.info("======== 查询设备列表（带库存信息）完成 ========");
        
        return resultList;
    }

    /**
     * 查询设备详情（带库存信息）
     * 
     * @param deviceId 设备ID
     * @return 设备+库存信息
     */
    @Override
    public RentalDeviceWithInventoryVo selectRentalDeviceWithInventoryByDeviceId(Long deviceId)
    {
        log.info("======== 查询设备详情（带库存信息）请求 ========");
        log.info("设备ID: {}", deviceId);
        
        // 1. 查询设备信息
        RentalDevices device = rentalDevicesMapper.selectRentalDevicesByDeviceId(deviceId);
        if (device == null) {
            log.warn("未找到设备信息，设备ID: {}", deviceId);
            log.info("======== 查询设备详情（带库存信息）完成：无数据 ========");
            return null;
        }
        
        // 2. 查询库存信息
        RentalDeviceInventory queryInventory = new RentalDeviceInventory();
        queryInventory.setDeviceId(deviceId);
        List<RentalDeviceInventory> inventoryList = rentalDeviceInventoryService.selectRentalDeviceInventoryList(queryInventory);
        
        RentalDeviceInventory inventory = null;
        if (!inventoryList.isEmpty()) {
            inventory = inventoryList.get(0); // 取第一条记录
            log.info("找到库存信息: 总数量={}, 可用数量={}", inventory.getTotalQuantity(), inventory.getAvailableQuantity());
        } else {
            log.info("未找到库存信息，设备ID: {}", deviceId);
        }
        
        // 3. 组装结果
        RentalDeviceWithInventoryVo result = new RentalDeviceWithInventoryVo(device);
        result.setInventoryInfo(inventory);
        
        log.info("======== 查询设备详情（带库存信息）完成 ========");
        return result;
    }
}
